package co.gov.medellin.ssti.sub.common.util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;

public class Utility {

	// ------------------------------------------------------------------------
	// Constantes
	// ------------------------------------------------------------------------
	/**
	 * Formato estandar para la fecha
	 */
	public static final String DATE_FORMAT = "dd/MM/yyyy";

	/**
	 * Codigos Filtros reportes.
	 */
	public static final String MAYOR_IGUAL = ">=";
	public static final String MENOR_IGUAL = "<=";
	public static final String IGUAL = "=";
	public static final String DIFERENTE = "<>";
	public static final String MENOR = "<";
	public static final String MAYOR = ">";
	public static final String ENTRE = "BETWEEN";
	public static final String PARECIDO = "LIKE";

	/**
	 * Filtros reportes. Etiquetas o texto del filtro.
	 */
	public static final String MAYOR_IGUAL_E = "[>=] Mayor o Igual";
	public static final String MENOR_IGUAL_E = "[<=] Menor o Igual";
	public static final String IGUAL_E = "[=] Igual a";
	public static final String DIFERENTE_E = "[!=] Diferente a";
	public static final String MENOR_E = "[<] Menor";
	public static final String MAYOR_E = "[>] Mayor";
	public static final String ENTRE_E = "Entre";
	public static final String PARECIDO_E = "LIKE";

	private static final String[] arrayCodFiltros = { MAYOR_IGUAL, MENOR_IGUAL,
			IGUAL, DIFERENTE, MENOR, MAYOR, ENTRE, PARECIDO };

	/**
	 * Operaciones realizadas en las paginas para verificar en las Action la
	 * accion realizada por el usuario.
	 */
	public static final String OP_ADD_FILTRO = "ADD_FILTRO";
	public static final String OP_BUSCAR = "BUSCAR";
	public static final String OP_DELETE_FILTRO = "DELETE_FILTRO";
	public static final String OP_SELECT_PROGRAMA = "SELECT_PROGRAMA";
	public static final String OP_SELECT_AREA = "SELECT_AREA";
	public static final String OP_SELECT_ATRIBUTO = "SELECT_ATRIBUTO";
	public static final String OP_SELECT_BARRIO = "SELECT_BARRIO";
	public static final String OP_SELECT_COMUNA = "SELECT_COMUNA";
	public static final String OP_SELECT_FILTRO = "SELECT_FILTRO";
	public static final String OP_SELECT_ZONA = "SELECT_ZONA";
	public static final String OP_GENERAR_REPORTE = "OP_GENERAR_REPORTE";
	public static final String OP_GUARDAR = "GUARDAR";
	public static final String OP_VALIDAR = "VALIDAR";
	public static final String OP_VOLVER = "VOLVER";

	/**
	 * Codcampos y etiquetas para GF.
	 */
	public static final String NAME_GRUPOFAM = "NAME_GRUPOFAM";
	public static final String NAME_GRUPOFAM_E = "NOMBRE GRUPO FAMILIAR";

	public static final String NAME1_BENE = "NAME1_BENE";
	public static final String NAME1_BENE_E = "PRIMER NOMBRE JEFE DE HOGAR";

	public static final String NAME2_BENE = "NAME2_BENE";
	public static final String NAME2_BENE_E = "SEGUNDO NOMBRE JEFE DE HOGAR";

	public static final String APE1_BENE = "APE1_BENE";
	public static final String APE1_BENE_E = "PRIMER APELLIDO JEFE DE HOGAR";

	public static final String APE2_BENE = "APE2_BENE";
	public static final String APE2_BENE_E = "SEGUNDO APELLIDO JEFE DE HOGAR";

	public static final String NUMERO_DOCUMENTO_GF = "NUMERO_DOCUMENTO";
	public static final String NUMERO_DOCUMENTO_GF_E = "No DOCUMENTO JEFE DE HOGAR";

	public static final String NUMERO_BENEFICIOS = "NUMERO_BENEFICIOS";
	public static final String NUMERO_BENEFICIOS_E = "NUMERO DE BENEFICIOS";

	public static final String ORIGEN_A = "A";
	public static final String ORIGEN_N = "N";

	/**
	 * Array de codCampo para GF.
	 */
	private static final String arrayCodCamposGF[] = { NAME_GRUPOFAM,
			NAME1_BENE, NAME2_BENE, APE1_BENE, APE2_BENE, NUMERO_DOCUMENTO_GF,
			NUMERO_BENEFICIOS };

	/**
	 * Codcampos y etiquetas (esto podria salir de bd, seria mejor)
	 */
	// public static final String
	public static final String BARRIO = "VFL_CODIGO_BARRIO";
	public static final String BARRIO_E = "BARRIO/VEREDA";
	public static final String COMUNA = "VFL_CODIGO_COMUNA";
	public static final String COMUNA_E = "COMUNA/CORREGIMIENTO";
	public static final String CORREO_ELECTRONICO = "CORREO_ELECTRONICO";
	public static final String CORREO_ELECTRONICO_E = "CORREO ELECTRONICO";
	public static final String EDAD = "EDAD";
	public static final String EDAD_E = "EDAD";
	public static final String ETNIA = "ETNIA";
	public static final String ETNIA_E = "ETNIA";
	public static final String FECHA_NACIMIENTO = "FECHA_NACIMIENTO";
	public static final String FECHA_NACIMIENTO_E = "FECHA NACIMIENTO";
	public static final String NUMERO_DOCUMENTO = "NUMERO_DOCUMENTO";
	public static final String NUMERO_DOCUMENTO_E = "NUMERO DOCUMENTO";
	public static final String PRIMER_APELLIDO = "PRIMER_APELLIDO";
	public static final String PRIMER_APELLIDO_E = "PRIMER APELLIDO";
	public static final String PRIMER_NOMBRE = "PRIMER_NOMBRE";
	public static final String PRIMER_NOMBRE_E = "PRIMER NOMBRE";
	public static final String SEGUNDO_APELLIDO = "SEGUNDO_APELLIDO";
	public static final String SEGUNDO_APELLIDO_E = "SEGUNDO APELLIDO";
	public static final String SEGUNDO_NOMBRE = "SEGUNDO_NOMBRE";
	public static final String SEGUNDO_NOMBRE_E = "SEGUNDO NOMBRE";
	public static final String SEXO = "SEXO";
	public static final String SEXO_E = "SEXO";
	public static final String TELEFONO = "TELEFONO";
	public static final String TELEFONO_E = "TELEFONO";
	public static final String TIPO_DOCUMENTO = "TIPO_DOCUMENTO";
	public static final String TIPO_DOCUMENTO_E = "TIPO DOCUMENTO";
	public static final String ZONA = "VFL_CODIGO_ZONA";
	public static final String ZONA_E = "ZONA";
	// sisben
	public static final String DISCAPACIDAD_SISBEN = "DISCAPACIDAD_SISBEN";
	public static final String DISCAPACIDAD_SISBEN_E = "DISCAPACIDAD SISBEN";
	public static final String HOGAR_SISBEN = "HOGAR_SISBEN";
	public static final String HOGAR_SISBEN_E = "HOGAR SISBEN";
	public static final String FECHA_ENCUESTA_SISBEN = "FECHA_ENCUESTA_SISBEN";
	public static final String FECHA_ENCUESTA_SISBEN_E = "FECHA ENCUESTA SISBEN";
	public static final String FICHA_SISBEN = "FICHA_SISBEN";
	public static final String FICHA_SISBEN_E = "FICHA SISBEN";
	public static final String NIVEL_SISBEN = "NIVEL_SISBEN";
	public static final String NIVEL_SISBEN_E = "NIVEL SISBEN";
	public static final String ORDEN_SISBEN = "ORDEN_SISBEN";
	public static final String ORDEN_SISBEN_E = "ORDEN SISBEN";
	public static final String PUNTAJE_SISBEN = "PUNTAJE_SISBEN";
	public static final String PUNTAJE_SISBEN_E = "PUNTAJE SISBEN";

	public static final String TIPO_CAMPO_ALFANUMERICO = "A";
	public static final String TIPO_CAMPO_FECHA = "F";
	public static final String TIPO_CAMPO_NUMERICO = "N";

	/**
	 * Collection de codCampos.
	 */
	public static final Collection<RepAtributoVO> codCampos;
	static {
		codCampos = new ArrayList<RepAtributoVO>();
		RepAtributoVO repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(BARRIO);
		repAtributoVO.setEtiqueta(BARRIO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(COMUNA);
		repAtributoVO.setEtiqueta(COMUNA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(CORREO_ELECTRONICO);
		repAtributoVO.setEtiqueta(CORREO_ELECTRONICO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(EDAD);
		repAtributoVO.setEtiqueta(EDAD_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(ETNIA);
		repAtributoVO.setEtiqueta(ETNIA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(FECHA_NACIMIENTO);
		repAtributoVO.setEtiqueta(FECHA_NACIMIENTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_FECHA);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NUMERO_DOCUMENTO);
		repAtributoVO.setEtiqueta(NUMERO_DOCUMENTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(PRIMER_APELLIDO);
		repAtributoVO.setEtiqueta(PRIMER_APELLIDO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(PRIMER_NOMBRE);
		repAtributoVO.setEtiqueta(PRIMER_NOMBRE_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SEGUNDO_APELLIDO);
		repAtributoVO.setEtiqueta(SEGUNDO_APELLIDO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SEGUNDO_NOMBRE);
		repAtributoVO.setEtiqueta(SEGUNDO_NOMBRE_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(SEXO);
		repAtributoVO.setEtiqueta(SEXO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(TELEFONO);
		repAtributoVO.setEtiqueta(TELEFONO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(TIPO_DOCUMENTO);
		repAtributoVO.setEtiqueta(TIPO_DOCUMENTO_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(ZONA);
		repAtributoVO.setEtiqueta(ZONA_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(DISCAPACIDAD_SISBEN);
		repAtributoVO.setEtiqueta(DISCAPACIDAD_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(HOGAR_SISBEN);
		repAtributoVO.setEtiqueta(HOGAR_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(FECHA_ENCUESTA_SISBEN);
		repAtributoVO.setEtiqueta(FECHA_ENCUESTA_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_FECHA);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(FICHA_SISBEN);
		repAtributoVO.setEtiqueta(FICHA_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_FECHA);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(NIVEL_SISBEN);
		repAtributoVO.setEtiqueta(NIVEL_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(ORDEN_SISBEN);
		repAtributoVO.setEtiqueta(ORDEN_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_ALFANUMERICO);
		codCampos.add(repAtributoVO);

		repAtributoVO = new RepAtributoVO();
		repAtributoVO.setNombre(PUNTAJE_SISBEN);
		repAtributoVO.setEtiqueta(PUNTAJE_SISBEN_E);
		repAtributoVO.setTipoCampo(TIPO_CAMPO_NUMERICO);
		codCampos.add(repAtributoVO);

	}

	/**
	 * tipodato de los atributos.
	 */
	public static final String TIPO_ALFANUMERICO = "A";
	public static final String TIPO_NUMERICO = "N";
	public static final String TIPO_FECHA = "F";

	/*
	 * public Map getMapCodCampos() { // shallow copy return new
	 * HashMap(mapCodCampos); }
	 */

	// ------------------------------------------------------------------------
	// Metodo Publicos
	// ------------------------------------------------------------------------

	/**
	 * Retorna una fecha tipo <code>java.util.Date</code> a partir de una cadena
	 * de caracteres en el formato indicado en la constante DATE_FORMAT.
	 * 
	 * @param dateAsString
	 *            Cadena de caracteres que indica una fecha en el formato
	 *            indicado en la constante DATE_FORMAT.
	 * 
	 * @return Fecha calculada a partir de la cadena indicada.
	 */
	public static Date getDateFromString(String dateAsString) throws Exception {
		// Variables locales
		Date date = null;
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
		// Hace setLenient para que la conversion sea mas flexible en cuanto al
		// formato.
		sdf.setLenient(false);
		try {
			date = sdf.parse(dateAsString);
		} catch (ParseException e) {
			throw new Exception("Formato de fecha no valido. " + dateAsString);
		}
		return date;
	}

	/**
	 * Retorna una fecha tipo <code>java.util.Date</code> a partir de una fecha
	 * del mismo tipo de clase, en el formato indicado en la constante
	 * DATE_FORMAT.
	 * 
	 * @param dateAsString
	 *            Cadena de caracteres que indica una fecha en el formato
	 *            indicado en la constante DATE_FORMAT.
	 * 
	 * @return Fecha calculada a partir de la cadena indicada.
	 */
	public static Date getFormatedDate(java.util.Date uDate) throws Exception {
		// Variables locales
		Date date = null;
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
		// Hace setLenient para que la conversion sea mas flexible en cuanto al
		// formato.
		sdf.setLenient(false);
		// Conversion de la fecha
		try {
			date = sdf.parse(sdf.format(uDate));
		} catch (ParseException e) {
			throw new Exception("Formato de fecha no valido. " + uDate);
		}
		return date;
	}

	/**
	 * Retorna una cadena de caracteres que representa la fecha indicada con el
	 * formato indicado en la constante DATE_FORMAT.
	 * 
	 * @param date
	 *            Fecha a convertir en cadena de caracteres.
	 * 
	 * @return Cadena de caracteres que representa la fecha en el formato.
	 */
	public static String getStringFromDate(Date date) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
		String aux = null;
		sdf.setLenient(false);
		try {
			if (date != null) {
				aux = sdf.format(date);
			}
		} catch (Exception e) {
			throw new Exception("Formato de fecha no valido.");
		}
		sdf = null;
		return aux;
	}

	/**
	 * Convierte un objeto de tipo java.util.Date a su correspondiente en
	 * java.sql.Date.
	 * 
	 * @param date
	 *            Objeto java.util.Date
	 * 
	 * @return Objeto java.sql.Date
	 */
	public static java.sql.Date getSQLDate(Date date) {
		java.sql.Date sqlDate = null;
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
		sdf.setLenient(false);
		if (date != null) {
			sqlDate = java.sql.Date.valueOf(sdf.format(date));
		}
		return sqlDate;
	}

	/**
	 * Convierte un objeto de tipo java.sql.Date a su correspondiente en
	 * java.util.Date.
	 * 
	 * @param date
	 *            Objeto java.sql.Date
	 * 
	 * @return Objeto java.util.Date
	 */
	public static java.util.Date sqlDateToUtilDate(java.sql.Date fecha)
			throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
		sdf.setLenient(false);
		return sdf.parse(sdf.format(fecha));
	}

	/**
	 * Obtiene el siguiente valor de una secuencia determinada.
	 * 
	 * @param sequenceName
	 *            Nombre de la secuencia.
	 * @param conn
	 *            Este metodo requiere una conexion a la base de datos
	 * 
	 * @return Siguiente valor de la secuencia.
	 * @throws SQLException
	 */
	public static long getSequenceNextValue(Connection conn, String sequenceName)
			throws SQLException {
		// Variables locales
		long value = 0;
		Statement statement = null;
		ResultSet resultSet = null;
		StringBuffer query = new StringBuffer(256);
		query.append("SELECT ");
		query.append(sequenceName.trim());
		query.append(".NEXTVAL codigo FROM dual");
		try {
			statement = conn.createStatement();
			resultSet = statement.executeQuery(query.toString());
			if (resultSet.next()) {
				value = resultSet.getLong("codigo");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
			throw new SQLException(
					"IISAM [SQLEXCEPTION]: Error obteniendo un nuevo valor de secuencia "
							+ sequenceName);
		} finally {
			if (resultSet != null) {
				resultSet.close();
			}
			if (statement != null) {
				statement.close();
			}
		}
		query = null;
		statement = null;
		resultSet = null;
		return value;
	}

	/**
	 * Formatea todos los campos que traen una convencion numerica del SISBEN a
	 * una convencion alfanumerica del SUB.
	 * 
	 * @param beneficiary
	 */
	public static void formatSisben(BeneficiarioVO beneficiary) {
		formatSisbenDocument(beneficiary);
		formatSisbenSex(beneficiary);
		// formatSisbenParentesco(beneficiary);
	}

	/**
	 * Cambia el formato del tipo de documento, de numerico que es alamacenado
	 * en el SISBEN a alfanumerico el cual es el estandar del sistema SUB.
	 * 
	 * @param beneficiary
	 */
	public static void formatSisbenDocument(BeneficiarioVO beneficiary) {
		switch (Integer.parseInt(beneficiary.getTipoDocumento())) {
		case 1:
			beneficiary.setTipoDocumento("C");
			break;
		case 2:
			beneficiary.setTipoDocumento("T");
			break;
		case 3:
			beneficiary.setTipoDocumento("E");
			break;
		case 4:
			beneficiary.setTipoDocumento("R");
			break;
		case 0:
			beneficiary.setTipoDocumento("O");
			break;
		default:
			break;
		}
	}

	/**
	 * Cambia el formato del parentesco, de numerico que es alamacenado en el
	 * SISBEN a alfanumerico el cual es el estandar del sistema SUB.
	 * 
	 * @param beneficiary
	 */
	public static void formatSisbenParentesco(BeneficiarioVO beneficiary) {
		switch (Integer.parseInt(beneficiary.getParentesco())) {
		case 1:
			beneficiary.setParentesco("Jefe");
			break;
		case 2:
			beneficiary.setParentesco("conyugue o companero(a)");
			break;
		case 3:
			beneficiary.setParentesco("hijo(a) / hijastro(a)");
			break;
		case 4:
			beneficiary.setParentesco("Nieto(a)");
			break;
		case 5:
			beneficiary.setParentesco("Padre / Madre");
			break;
		case 6:
			beneficiary.setParentesco("Hermano(a)");
			break;
		case 7:
			beneficiary.setParentesco("Yerno / Nuera");
			break;
		case 8:
			beneficiary.setParentesco("Abuelo(a)");
			break;
		case 9:
			beneficiary.setParentesco("Suegro(a)");
			break;
		case 10:
			beneficiary.setParentesco("Tio(a)");
			break;
		case 11:
			beneficiary.setParentesco("Sobrino(a)");
			break;
		case 12:
			beneficiary.setParentesco("Primo(a)");
			break;
		case 13:
			beneficiary.setParentesco("Cunado(a)");
			break;
		case 14:
			beneficiary.setParentesco("Otros parientes");
			break;
		case 15:
			beneficiary.setParentesco("Otros no parientes");
			break;
		case 16:
			beneficiary.setParentesco("Servicio domestico o cuidandero");
			break;
		case 17:
			beneficiary
					.setParentesco("Pariente de servicio domestico o cuidandero");
			break;
		default:
			break;
		}
	}

	/**
	 * Cambia el formato del sexo, de numerico que es alamacenado en el SISBEN a
	 * alfanumerico el cual es el estandar del sistema SUB.
	 * 
	 * @param beneficiary
	 */
	public static void formatSisbenSex(BeneficiarioVO beneficiary) {
		Integer caso;
		try {
			caso = Integer.parseInt(beneficiary.getSexo());
		} catch (Exception e) {
			return;// TODO: handle exception
		}
		switch (caso) {
		case 1:
			beneficiary.setSexo("M");
			break;
		case 2:
			beneficiary.setSexo("F");
			break;
		default:
			break;
		}
	}

	/**
	 * Cambia el formato del documento en el estandar de planeacion C/E/R/T
	 * hacia el formato del SISBEN 1/2/3/4
	 * 
	 * @param documentType
	 *            tipo de documento a formatear.
	 */
	public static String deformatSisbenDocument(String documentType) {
		if ("C".equals(documentType)) {
			documentType = "1";
		} else if ("R".equals(documentType)) {
			documentType = "4";
		} else if ("T".equals(documentType)) {
			documentType = "2";
		} else if ("E".equals(documentType)) {
			documentType = "3";
		}
		return documentType;
	} // fin deformat sisben

	/**
	 * Cambia el formato del documento en el estandar de planeacion C/E/R/T
	 * hacia el formato del SISBEN 1/2/3/4
	 * 
	 * @param documentType
	 *            tipo de documento a formatear.
	 */
	public static String deformatSisbenDocumentToSubDocument(String documentType) {
		if ("1".equals(documentType)) {
			documentType = "C";
		} else if ("4".equals(documentType)) {
			documentType = "R";
		} else if ("2".equals(documentType)) {
			documentType = "T";
		} else if ("3".equals(documentType)) {
			documentType = "E";
		}
		return documentType;
	} // fin deformat sisben

	/**
	 * Cambia el formato del documento en el estandar de planeacion C/E/R/T
	 * hacia el formato del SIPOD CC/RC/TI/CE
	 * 
	 * @param documentType
	 *            tipo de documento a formatear.
	 */
	public static String deformatSipodDocument(String documentType) {
		if ("C".equals(documentType)) {
			documentType = "CC";
		} else if ("R".equals(documentType)) {
			documentType = "RC";
		} else if ("T".equals(documentType)) {
			documentType = "TI";
		} else if ("E".equals(documentType)) {
			documentType = "CE";
		}
		return documentType;
	} // fin deformat sisben

	/**
	 * Cambia el formato del documento en el estandar de del SISBENv2
	 * CC/RC/TI/CE hacia el formato del SISBENv3 1/2/3/4
	 * 
	 * @param documentType
	 *            tipo de documento a formatear.
	 */
	public static String deformatSisben2ToSisben3Document(String documentType) {
		if ("CC".equals(documentType)) {
			documentType = "1";
		} else if ("RC".equals(documentType)) {
			documentType = "4";
		} else if ("TI".equals(documentType)) {
			documentType = "2";
		} else if ("CE".equals(documentType)) {
			documentType = "3";
		}
		return documentType;
	} // fin deformat sisben

	/**
	 * Cambia el formato del tipo de documento, de numerico que es alamacenado
	 * en el SISBEN3 a alfanumerico el cual es el estandar del sistema SISBEN2.
	 * 
	 * @param beneficiary
	 */
	public static String deformatSisbenDosDocument(String documentType) {
		if ("1".equals(documentType)) {
			documentType = "CC";
		} else if ("4".equals(documentType)) {
			documentType = "RC";
		} else if ("2".equals(documentType)) {
			documentType = "TI";
		} else if ("3".equals(documentType)) {
			documentType = "CE";
		}
		return documentType;
	}

	public static boolean isCodCampoGFValido(String codCampo) {
		for (int i = 0; i < arrayCodCamposGF.length; i++) {
			if (arrayCodCamposGF[i].equals(codCampo)) {
				return true;
			}
		}
		return false;
	}

	public static boolean isCodFiltroValido(String codFiltro) {
		for (int i = 0; i < arrayCodFiltros.length; i++) {
			if (arrayCodFiltros[i].equals(codFiltro)) {
				return true;
			}
		}
		return false;
	}

	public static boolean isDateValid(String date) {
		try {
			DateFormat df = new SimpleDateFormat(DATE_FORMAT);
			df.setLenient(false);
			df.parse(date);
			return true;
		} catch (ParseException e) {
			return false;
		}
	}

}
